import os
import re
import cn2an  # 导入cn2an

# 使用 logger_setup.py 中的 logger
from logger_setup import logger

def get_filepath_from_gradio_output(output_data):
    """
    从Gradio的predict输出中提取文件路径
    
    Args:
        output_data: Gradio输出结果，可能是字符串或字典
        
    Returns:
        str: 提取到的文件路径，若提取失败则为None
    """
    # 直接是文件路径字符串
    if isinstance(output_data, str) and os.path.exists(output_data):
        return output_data
    # 包含name字段的字典
    if (
        isinstance(output_data, dict)
        and "name" in output_data
        and isinstance(output_data["name"], str)
        and os.path.exists(output_data["name"])
    ):
        return output_data["name"]
    # 包含value字段的字典
    if (
        isinstance(output_data, dict)
        and "value" in output_data
        and isinstance(output_data["value"], str)
        and os.path.exists(output_data["value"])
    ):
        return output_data["value"]
    # 包含video字段的字典
    if (
        isinstance(output_data, dict)
        and "video" in output_data
        and isinstance(output_data["video"], str)
        and os.path.exists(output_data["video"])
    ):
        return output_data["video"]
    # 提取失败
    logger.warning(f"无法从Gradio输出中提取有效的文件路径: {output_data}")
    return None

def cleanup_local_files(file_list):
    """
    安全清理本地文件
    
    Args:
        file_list: 要清理的文件路径列表
    """
    for file_path in file_list:
        if os.path.exists(file_path):
            try:
                os.remove(file_path)
                logger.debug(f"已清理本地文件: {file_path}")
            except OSError as e:
                logger.warning(f"清理本地文件 {file_path} 失败: {e}")

# 自定义异常类
class ServerTaskFailedError(Exception):
    """用于标记可在其他服务器上重试的任务失败的自定义异常"""
    def __init__(self, message, original_exception=None):
        super().__init__(message)
        self.original_exception = original_exception  # 存储原始异常信息，方便调试 

def format_text_for_speech(text: str) -> str:
    """
    将文本格式化为适合语音合成的格式：
    1. 将阿拉伯数字转换为中文数字
    2. 将特定符号转换为中文表述
    3. 确保文本末尾有标点符号
    """
    if not text:
        return ""

    try:
        # 将阿拉伯数字转换为中文数字
        processed_text = cn2an.transform(text, "an2cn")
        logger.debug(f"数字转换结果: '{text}' -> '{processed_text}'")
    except Exception as e:
        logger.warning(f"数字转换失败 '{text}': {e}，使用原文")
        processed_text = text

    # 符号映射表
    symbol_mapping = {
        '+': '加',
        '=': '等于',
        '-': '减',
    }
    for symbol, chinese in symbol_mapping.items():
        processed_text = processed_text.replace(symbol, chinese)

    # 确保文本末尾有标点符号
    chinese_punctuations = "。！？；：，\"＂''（）《》〈〉【】『』「」﹃﹄﹂﹁﹏﹋﹌─━│┃┄┅┆┇┈┉┊┋"
    english_punctuations = ".,?!;:'\"()<>[]{}~`!@#$%^&*()_+-={}|[]\\\\:\";'<>?,./"
    all_punctuations = set(chinese_punctuations + english_punctuations)

    if processed_text and not any(processed_text.endswith(p) for p in all_punctuations):
        processed_text += "。"
        
    return processed_text